class ReservaSp < ActiveRecord::Base
	belongs_to :servicio
	belongs_to :moneda
	belongs_to :archivo
	belongs_to :archivo_servicio
	has_and_belongs_to_many :reservas, :join_table => "reservas_sp_reservas"
	attr_accessor :nro_pasajeros
	
	def proveedor
		servicio.proveedor
	end
	
	def costo_en(_moneda)
		TipoCambio.cambiar(costo, moneda, _moneda, fecha_calculo)		
	end
	
	def to_s
		servicio.to_s
	end
	
	def utilidad_en(_moneda)		
		precio_en(_moneda) - costo_en(_moneda)
	end
	
	def precio_en(_moneda)
		TipoCambio.cambiar(precio, moneda, _moneda, fecha_calculo)		
	end
	
	def costo
		if total_manual != nil
			total_manual
		else
			precio_extranjero * cantidad
		end		
	end
	
	def utilidad
		precio - costo
	end
	
	def precio
		if utilidad_ajustada
			precio_publicado * cantidad
		else
			((precio_extranjero * (utilidad_porcentaje+100))/100) * cantidad
		end		
	end
	
	def sin_reserva?
		reservas.inject(true) { |rpta, reserva| rpta=rpta and reserva.anulada? }
	end
	
	def generar
  	sql = "select 
				s.id as servicio_id, 
				p.moneda_id,
				p.publicado as precio_publicado,	
				p.nacional as precio_nacional, 
				p.extranjero as precio_extranjero,
				ts.utilidad_porcentaje,
				ts.utilidad_ajustada,
			  ceil(#{nro_pasajeros}/s.capacidad) as cantidad,
			  now() as fecha_calculo			  
			from 
				servicios s inner join precios p
			    on p.servicio_id = s.id
			  left outer join tipos_servicio ts
			    on s.tipo_servicio_id = ts.id
			where
			  s.id = #{servicio_id.to_s} and
			  ('#{fecha}' between p.fecha_inicio and p.fecha_fin) and
			  (least(#{nro_pasajeros},s.capacidad) between p.nro_personas_inicio and p.nro_personas_fin)"
		
		rpta = ReservaSp.find_by_sql(sql)		
		
		if rpta.size == 0
			raise "No existe precio para el servicio\nProveedor: '#{servicio.proveedor}', Servicio: '#{servicio}', nro: #{nro_pasajeros}, fecha: #{fecha}"
		end		
		
		self.servicio_id = rpta[0].servicio_id
		self.moneda_id = rpta[0].moneda_id
		self.precio_publicado = rpta[0].precio_publicado
    self.precio_extranjero = rpta[0].precio_extranjero
    self.precio_nacional = rpta[0].precio_nacional
    self.utilidad_porcentaje = rpta[0].utilidad_porcentaje
    self.utilidad_ajustada = rpta[0].utilidad_ajustada
    self.cantidad = rpta[0].cantidad
    self.fecha_calculo = rpta[0].fecha_calculo
    self.fecha = fecha
    self.archivo_servicio_id = archivo_servicio_id    
	end
	
	def self.por_proveedor_pdf(proveedor_id, fecha_inicio, fecha_fin)
		pdf = PDF::Writer.new(:paper=>'A4')
		pdf.select_font "Times-Roman"		
		pdf.margins_cm(0.5)
		proveedor = Proveedor.find(proveedor_id)
		# 1. Cabecera
		pdf.add_text_wrap(pdf.absolute_left_margin, pdf.absolute_top_margin, 150, "TRANS TREKPERU E.I.R.L.")				
		pdf.text "RESERVAS POR PROVEEDOR", :font_size => 14, :justification=>:center
		pdf.text "."
		pdf.text "PROVEEDOR : #{proveedor.nombre}", :font_size => 10
		pdf.text "FECHA : Del #{fecha_inicio} al #{fecha_fin}", :font_size => 10
		pdf.text	"-"*170
		
		# 2. Cuerpo
		tabla = PDF::SimpleTable.new
		tabla.heading_font_size = 9
		tabla.font_size = 7
		tabla.show_lines = :none
		tabla.shade_rows = :none
		tabla.position = :left
		tabla.orientation = :right
		tabla.width = 580
		tabla.column_order = ['OS', 'FECHA', 'SERVICIO', 'CT', 'M', 'PU','SOLES', 'DOLARE']		
		
		tabla.columns["OS"] = PDF::SimpleTable::Column.new("OS") { |col|			
			col.width = 25
		}
		tabla.columns["FECHA"] = PDF::SimpleTable::Column.new("FECHA") { |col|			
			col.width = 50
		}
		tabla.columns["SERVICIO"] = PDF::SimpleTable::Column.new("SERVICIO") { |col|			
			col.width = 180
		}
		tabla.columns["CT"] = PDF::SimpleTable::Column.new("CT") { |col|			
			col.width = 30
			col.justification = :right
		}		
		tabla.columns["M"] = PDF::SimpleTable::Column.new("M") { |col|			
			col.width = 30
			col.justification = :right
		}
		tabla.columns["PU"] = PDF::SimpleTable::Column.new("PU") { |col|			
			col.width = 35
			col.justification = :right
		}
		tabla.columns["SOLES"] = PDF::SimpleTable::Column.new("SOLES") { |col|			
			col.width = 50
			col.justification = :right
		}
		tabla.columns["DOLARE"] = PDF::SimpleTable::Column.new("DOLARE") { |col|			
			col.width = 50
			col.justification = :right
		}
		
		grupos = por_proveedor_grupos(proveedor_id, fecha_inicio, fecha_fin)
		
		total_soles = 0
		total_dolares = 0
		for grupo in grupos
			pdf.text	"."
			pdf.text "#{grupo.grupo_nombre}", :font_size => 10
			pdf.text	"="*grupo.grupo_nombre.size, :font_size => 10
			data = por_proveedor(grupo.grupo_id, proveedor_id, fecha_inicio, fecha_fin)
			tabla.data = data		
			tabla.render_on(pdf)		
			# 3. Totales	
			t_soles = data.inject(0) { |t, os| t+=os.SOLES.to_f }
			total_soles += t_soles
			t_dolares = data.inject(0) { |t, os| t+=os.DOLARE.to_f}	
			total_dolares += t_dolares
			pdf.text "Total Soles : S/. #{t_soles}", :font_size => 8
			pdf.text "Total Dolares : US$ #{t_dolares}", :font_size => 8
			pdf.text	"-"*170, :font_size => 10
		end
		pdf.text "Total Soles : S/. #{total_soles}", :font_size => 9
		pdf.text "Total Dolares : US$ #{total_dolares}", :font_size => 9
		pdf.text	"-"*170, :font_size => 10
		pdf.render
	end	
	
	def self.por_proveedor_grupos(proveedor_id, fecha_inicio, fecha_fin)
		ReservaSp.find_by_sql(["
			SELECT DISTINCT 			
				a.id as grupo_id,
				a.codigo as grupo_nombre
			FROM
				reserva_sps rs
				JOIN servicios s ON rs.servicio_id = s.id
				JOIN archivos a ON rs.archivo_id = a.id
			WHERE
				s.proveedor_id = #{proveedor_id} AND
				rs.fecha BETWEEN '#{fecha_inicio}' AND '#{fecha_fin}'
			ORDER BY
				a.fecha_arribo"])	
	end

	def self.por_proveedor(archivo_id, proveedor_id, fecha_inicio, fecha_fin)
		ReservaSp.find_by_sql(["
			SELECT 
				rsr.reserva_id as OS,
				rs.fecha as FECHA,
				s.nombre as SERVICIO,
				rs.cantidad as CT, 				
				m.simbolo as M,
				rs.precio_extranjero as PU,
				CASE
					WHEN m.id = 1 AND rs.total_manual IS NULL THEN rs.cantidad * rs.precio_extranjero
					WHEN m.id = 1 AND rs.total_manual IS NOT NULL THEN rs.total_manual
					ELSE 0
				END as SOLES,
				CASE
					WHEN m.id = 2 AND rs.total_manual IS NULL THEN rs.cantidad * rs.precio_extranjero
					WHEN m.id = 2 AND rs.total_manual IS NOT NULL THEN rs.total_manual
					ELSE 0
				END as DOLARE
			FROM
				reserva_sps rs
				JOIN servicios s ON rs.servicio_id = s.id
				JOIN monedas m	ON rs.moneda_id = m.id
				JOIN reservas_sp_reservas rsr ON rs.id = rsr.reserva_sp_id
				JOIN (
					SELECT 
						reserva_id, 
						max(estado_reserva_id) as estado_reserva_id
					FROM seguimientos_reserva 
					GROUP BY reserva_id
				) sr ON rsr.reserva_id=sr.reserva_id AND sr.estado_reserva_id <> 5
			WHERE
				s.proveedor_id = #{proveedor_id} AND
				rs.fecha BETWEEN '#{fecha_inicio}' AND '#{fecha_fin}' AND
				rs.archivo_id = #{archivo_id}
			ORDER BY
				rsr.reserva_id, rs.fecha"])	
	end
end
